package threadDemo;

import java.util.concurrent.TimeUnit;

/**
 * @author Ajie
 * @date 8/19/21
 * @function 守护线程-setDeamon(true)
 *
 * 当java虚拟机中没有非守护线程在运行的时候，java虚拟机会关闭。
 * 有其他线程时，不会关闭。
 *
 *
 * JAVA线程分为即实线程与守护线程，守护线程是优先级低，
 *
 * 存活与否不影响JVM的退出的线程，实现守护线程的方法是在线程start()之前setDaemon(true)，
 * 否则会抛出一个IllegalThreadStateException异常。
 * 不能操作文件、数据库等资源，避免主线程关闭而未能关闭守护线程的资源，并且它会在任何时候甚至在一个操作的中间发生中断。
 * 优点及使用场景
 * 在主线程关闭后无需手动关闭守护线程，因为会自动关闭，避免了麻烦，
 * <p>
 * Java垃圾回收线程就是一个典型的守护线程，简单粗暴的可以理解为所有为线程服务而不涉及资源的线程都能设置为守护线程。
 */
public class Thread_SetDeamon_Demo {
    static volatile boolean isfinish = false;
    public static void main(String[] args) {

        //守护线程
        Thread thread = new Thread(() -> {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("thread:"+Thread.currentThread().getName()+"watch dog ----睡眠一秒-----");
            }
        });
        //默认为false,设置为false代表非守护线程,true为守护线程,守护线程在主方法结束时候结束
        thread.setDaemon(true);
        thread.start();

        //工作线程
        new Thread(() -> {
            while (!isfinish) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.err.println("working thread:"+Thread.currentThread().getName()+"working ");
            }
        }).start();


        //停止所有非 守护线程。
        new Thread(() -> {
            while (!isfinish) {
                try {
                    TimeUnit.SECONDS.sleep(5);
                    isfinish = true;
                    System.out.println("working thread:"+Thread.currentThread().getName()+" finish >>>>>>>>>>>>>>>>>>>>>>>> ");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println("主线程over");


    }
}

